package Hot_100;

/*
    将一个给定字符串 s 根据给定的行数 numRows ，以从上往下、从左到右进行 Z 字形排列。
    比如输入字符串为 "PAYPALISHIRING" 行数为 3 时，排列如下
    来源：力扣（LeetCode）
    链接：https://leetcode.cn/problems/zigzag-conversion
    著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
*/
public class T6_convert {
    public static void main(String[] args) {
        String s="PAYPALISHIRING";
        convert(s, 3);
        /*"PAYPALISHIRING"  3*/
    }

    static String convert_test(String s, int numRows) {
        if (numRows <= 1) {
            return s;
        }

        int len = Math.min(s.length(), numRows);
        String[] strArray = new String[len];

        for (int i = 0; i < len; i++) {
            strArray[i]="";
        }

        boolean down=false;
        int loc=0;
        char[] toCharArray = s.toCharArray();

        for (int i = 0; i <s.length() ; i++) {
            strArray[loc]+=toCharArray[i];
            if (loc == 0 || loc == len - 1) {
                down=!down;
            }

            if (down) {
                loc++;
            }else{
                loc--;
            }
        }

        String s1="";
        for (int i = 0; i < len; i++) {
            s1+=strArray[i];
        }
        return s1;
    }


//    这个方法是取代使用二维数组，因为数组的列长度是不能确定的，所以用String会好一点
//    loc相当于一个指针,而down是控制变量
    static String convert(String s, int numRows) {
        if(numRows == 1)
            return s;

        int len = Math.min(s.length(), numRows);    // 取最小，画个图就知道了

        String []rows = new String[len];            // String数组实际就相当于 2维数组，len规定了数组的个数

        for(int i = 0; i< len; i++)                 //初始化字符串数组
            rows[i] = "";

        int loc = 0;            //  loc表示当前字符串数组的下标
        boolean down = false;   // down 为 true，则 loc+=1
        // down 为 false，则表示向右，则 loc-=1
        for(int i=0;i<s.length();i++) {
            rows[loc] += s.substring(i,i+1);    //截取s[i]
            if(loc == 0 || loc == numRows - 1)  //到达边界的时候取反
                down = !down;
            loc += down ? 1 : -1; //down为ture则+1，为false则-1
        }
        String ans = "";
        for(String row : rows) {
            ans += row;
        }
        return ans;
    }

//    模拟（不知道为什么超时了...）
    static String convert_2(String s, int numRows) {
        if (numRows ==1) {
            return s;
        }

        int len=s.length();
        char[] charArray = s.toCharArray();
        char[][] mg = new char[numRows][1000];    //行确定,列不确定
        int i=0,j=0,record=0,flag=0;

        for (int k = 0; k < len; k++) { //依次遍历完整个字符串

            if (k == len - 1) { //记录最后一列的列数
                record=j;
            }
            char c=charArray[k];

            mg[i][j]=charArray[k];

            if (j==flag) {      //处在偶数列(不能直接用整个判断，有问题的)
                if (i == numRows - 1) {  //下边界
                    i--;
                    j++;

                    flag+=(numRows-1);
                } else {    //上边界及非边界
                    i++;
                }
            }else{                      //处在奇数列
                i--;
                j++;
            }
        }
        String ans="";
        for (int k = 0; k < numRows; k++) {
            for (int l = 0; l <= record; l++) {
                if (mg[k][l]!='\u0000'){
//                    System.out.print(mg[k][l]+" ");
                    ans+=mg[k][l];
                }else{
//                    System.out.print("null ");
                }
            }
//            System.out.println();
        }
        return ans;
    }
}
